// src/main.rs

use ndarray::Array2;
// use ndarray::linalg::Dot;

fn rust_matmul(a: Array2<f32>, b: Array2<f32>) -> Array2<f32>{
    a.dot(&b)
}

#[cfg(test)]
mod tests {
    use super::*;
    use ndarray::array;  // 用于创建测试矩阵

    #[test]
    fn test_matmul() {
        // 1. 定义与Python完全相同的输入矩阵
        let a = array![[1.0f32, 2.0], [3.0, 4.0]];
        let b = array![[5.0f32, 6.0], [7.0, 8.0]];

        // 2. 调用Rust实现的矩阵乘法
        let result_rust = rust_matmul(a.clone(), b.clone());

        // 3. 定义Python的预期输出（从Python代码复制）
        let expected = array![[19.0f32, 22.0], [43.0, 50.0]];

        // 4. 验证误差：逐个元素对比，误差≤1e-5（浮点数计算允许微小差异）
        let max_error = result_rust
            .iter()
            .zip(expected.iter())
            .map(|(r, e)| (r - e).abs())
            .max_by(|a, b| a.partial_cmp(b).unwrap())
            .unwrap();

        assert!(max_error <= 1e-5, "误差过大：{} > 1e-5", max_error);
    }
}